package org.wheel.plugins.toolkit.sql.core;

import cn.hutool.core.util.StrUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public abstract class AbstractSegment implements SqlSegment {

    // 直接使用 LogFactory 创建日志对象，Hutool 会自动检测项目中的日志框架（优先级：Slf4j > Log4j > Logback > JDK Logging）
    private static final Log log = LogFactory.get();
    // 延迟加载表名
    private Class<?> tableEntityClass;
    // wrapper 可能需要延迟加载，允许在初始化时为null，但是后面需要执行bind方法，将函数参数绑定到wrapper中
    protected AbstractWrapper<?, ?> currentWrapper; // 用于窗口别名

    private String tableAlias;


    protected String calcTableAlias(){
        String alias = null;
        if(StrUtil.isNotBlank(this.getTableAlias())){
            alias = this.getTableAlias(); // 优先自定义别名
        }else if(this.currentWrapper != null && this.getTableEntityClass() != null){
            // ① 反序列化拿实体类
            Class<?> lambdaEntity = this.getTableEntityClass();
            // ② 拿当前 Wrapper 的实体类
            Class<?> wrapperEntity = this.currentWrapper.getEntityClass();
            // ③ 类型一致才继续，否则打印日志
            if (!lambdaEntity.getName().equals(wrapperEntity.getName())) {
//                log.debug("Lambda 字段所属实体 [{}] 与当前 Wrapper 实体 [{}] 不一致",
//                        lambdaEntity.getName(), wrapperEntity.getName());
                alias = this.currentWrapper.getContext().getAliasRegistry().resolveAlias(lambdaEntity, -1);
            } else {
                alias = this.currentWrapper.getMainAlias();
            }
        }else if(this.currentWrapper != null){
            alias = this.currentWrapper.getContext().getAliasRegistry().resolveAlias(tableEntityClass, -1);
        }
        return alias;
    }
}